程序在内存中的分布情况
	一个程序运行后在内存中会划分成不同的内存段，与编程相关有：
	代码段		text：二进制指令（if/for/函数），具有const属性且被初始化过的全局静态变量、字符串字面值，只读权限（不能修改）
	只读段：用来存储常量，一旦被修改就会产生段错误。
	全局数据段	data：存储被初始化过的全局变量。
	静态数据段	bss：存储没有被初始化过的全局变量和静态变量，程序运行后这段内存被清理成0。
	栈			stack：数据先入后出，操作系统自己管理，以函数为单位使用，内存的申请和释放都是自动的。
						存储局部变量、块变量。大小有限，安全
	堆			heap：数据无规则的堆在一起，由程序自己管理（手动申请、释放）。
					与指针配合使用，足够大，使用不方便，释放时间受控制
					不安全，容易产生内存碎片，内存泄漏
	命令行参数及环境变量表： 修饰main函数 
变量的分类：
	变量的属性：存储位置、生命周期、作用域
	
	全局变量：定义函数外。
		存储位置：初始化过存储在全局段，未初始化存储在静态数据段，全局变量有默认值。
		生命周期：程序运行前就定义好，程序结束后才会被释放，在程序运行期间不会被释放，比较浪费内存。
		作用域：整个程序的任何位置都可以使用。
		注意：是共享数据的一种方式，但要尽量少用，以免造成命令冲突。
	局部变量：定义在函数内，只属于它所在的函数。
		存储位置：栈，默认值不确定，记得初始化。
		生命周期：函数被调用时，变量才被定义出来。
			注意：函数执行结束变量就释放。
		作用域：从定义位置开始，到函数结束。
	块变量：定义在 if、for、while、等语句块内。
		存储位置：栈，默认值不确定，记得初始化。
		生命周期：语句块被执行时，变量才被定义出来。
			注意：函数执行结束变量就释放。
		作用域：从定义位置开始，到大括号结束。

修饰变量的关键字：
	auto 定义自动申请内存、释放的变量，不加就代码加。
		局部变量和块变量都默认添加 auto。
		注意：静态变量、全局变量不能用它来修饰
	const 用来保护数据，变量被修饰后就具有了"只读"属性。
		不能显式修改，但不代表不能改。
		被初始化过的全局变量被const修饰后才是真正的常量。
	
	static （重要）
			限制作用域：全局变量、普通函数
			改变存储位置：把局部变量、块变量的存储位置由栈改为bss（静态数据区）、data
			延长生命周期：把局部变量、块变量的生命周期延长与全局变量一样
		const int func(void); // const 修饰的是函数的返回值
		static int func(void); // static 修饰的是函数
		修饰函数：
			普通函数可以在程序中任何位置被调用。
			static函数只能在它所在的.c文件内调用。
		修饰变量
	volatile ：告诉编译器此变量的值不稳定、易变（不优化变量的取值） 
				多线程共享变量、硬件编程（裸机、驱动）
	register ：申请把变量的存储位置改为寄存器，但是申请不一定成功。
				被他修饰过的变量不能取地址。
	extern ： 声明变量，多用于不同.c之间共享全局变量
			（只能解决编译时的问题，不能解决链接时的问题）。

		注意：全局变量、局部变量、块变量可以同名。
			
		
什么是指针
为什么使用指针
如何使用指针
使用指针要注意的问题
数组与指针
